package com.second;
/*
 集合作准备
 重点：
 1、动态数组的概念
 2、添加元素时，如何进行数组的扩充（add方法实现）
 3、删除元素时，需要把要删除元素之后的元素向前移动，目的是确保数组的连续性
 */

import java.util.Arrays;

public class CustomArrayListDemo {
    public static void main(String[] args) {
        MyArrayList list = new MyArrayList(5);
        list.add(new Chicken(0, 5, "鸡哥"));
        list.add(new Chicken(1, 3, "鸡鸡"));
        list.add(new Chicken(2, 2, "小鸡"));
        list.add(new Chicken(3, 1, "大鸡"));
        list.add(new Chicken(4, 6, "小莞"));
        list.add(new Chicken(5, 2, "小东"));
        System.out.println("size==" + list.size());
        list.printAll();
        System.out.println("当前对象数组的长度为：" + list.length());
        System.out.println("--------删除----------");
        list.remove(4);
        list.printAll();
        System.out.println("--------修改----------");
        list.update(new Chicken(2, 3, "小宝"));
        list.printAll();
        System.out.println("--------查找----------");
        Chicken c = list.get(2);
        c.print();
    }
}


// 自定义动态对象数组（对象数组管理类：添加，修改，删除，查找）
class MyArrayList {

    private Chicken[] cs = null; //需要管理的对象数组

    private int count = 0; //对象数组中元素的个数

    MyArrayList(int size) {
        if (size > 0) {
            cs = new Chicken[size];
        } else {
            cs = new Chicken[5];
        }
    }

    //表示返回数组长度
    int length() {
        return cs.length;
    }

    //数组中有多少个元素
    int size() {
        return count;
    }


    //添加元素
    void add(Chicken chicken) {
        //判断元素个数是否已满（是不是等于数组的长度）
        if (count >= cs.length) {//当条件满足，表示数组需扩充
            //扩充数组的算法：1、二分之一 cs.length*3/2+1  ，2、1倍 cs.length*2
            int newLen = cs.length * 2;
            //
            cs = Arrays.copyOf(cs, newLen); //根据原数组的内容，创建一个新的长度数组
        }
        //添加元素
        cs[count] = chicken;
        count++;
    }

    //删除元素（参考PPT删除元素的逻辑）
    //1、先查到要删除的元素（确定要删除的元素）
    //2、依次把要删除元素的后一个元素往前移动（覆盖）
    //3、把最后一个元素设置为null
    void remove(int id) {
        for (int i = 0; i < count; i++) {
            if (cs[i].getId() == id) {//找到元素了
                //  1  2  3  4 5 6 [] [] []
                if (count - 1 - i >= 0)
                    System.arraycopy(cs, i + 1, cs, i, count - 1 - i);
                //把最后一个值赋值为null
                cs[count - 1] = null;
                count--;
                break;
            }
        }
    }

    // 修改元素（Chicken（id,age,name）,id是作为要修改的对象的id，用于作为条件,
    // age,name是作为新的值）
    void update(Chicken chicken) {
        for (int i = 0; i < count; i++) {
            if (cs[i].getId() == chicken.getId()) {//找到元素了
                cs[i].setAge(chicken.getAge());
                cs[i].setName(chicken.getName());
                break;
            }
        }
    }

    //从数据中获取对象
    Chicken get(int id) {

        for (int i = 0; i < count; i++) {
            if (cs[i].getId() == id) {//找到元素了
                return cs[i];
            }
        }
        return null;
    }
	/*
	public Chicken get(int index){
		return cs[index];
	}
	*/

    //打印所有对象
    void printAll() {
        for (int i = 0; i < count; i++) {
            cs[i].print();
        }
    }
}


//用来测试的对象
class Chicken {
    private int id;
    private int age;
    private String name;

    Chicken(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public void setId(int id) {
        this.id = id;
    }

    int getId() {
        return id;
    }

    void setAge(int age) {
        this.age = age;
    }

    int getAge() {
        return age;
    }

    void setName(String name) {
        this.name = name;
    }

    String getName() {
        return name;
    }

    void print() {
        System.out.println("id=" + id + ",age=" + age + ",name=" + name);
    }
}






